首先,在這裡介紹的Random是指java.util.Random。
而在Java中有不少class和method都是繼承至 java.util.Random,例如: ThreadLocalRandom, Math.random() 等等。
Random
java.util.Random中生成的隨機數是基於它的種子(seed),種子(在JDK 1.5之後)選用了System.nanoTime(),它是從某個不確定的時間起(可以是過去/現在/未來),到當下的時間差,精確到納秒,它的主要用途是衡量一個時間段,例如運行一段代碼/一個指令,所執行的時間。
而產生seed的值是運用了線性同餘法偽隨機數生成器linear congruential pseudorandom number generator (LGC)。這個算法最後得出的是偽隨機數。
因此,從輸出中可以很容易計算出種子值。
SecureRandom
SecureRandom也是繼承至 java.util.Random。
但SecureRandom 使用種子不是以時間作標準,而是以一些隨機事件作為標準,例如滑鼠點選、鍵盤點選等等。
此外,SecureRandom使用加密的強隨機數生成器 (RNG)來產生最終的seed值,以確保不能從輸出中的資料計算出種子值。